package com.kexio.security.service;

import java.util.List;
import java.util.Optional;

import com.kexio.common.dto.PageRequest;
import com.kexio.common.dto.PageResponse;
import com.kexio.security.domain.Role;

/**
 * 角色数据访问接口
 * 
 * @author kexio
 */
public interface RoleRepository {

    /**
     * 保存角色
     * @param role 角色实体
     * @return 保存后的角色实体
     */
    Role save(Role role);

    /**
     * 根据ID查找角色
     * @param id 角色ID
     * @return 角色实体
     */
    Optional<Role> findById(Long id);

    /**
     * 根据角色编码查找角色
     * @param roleCode 角色编码
     * @return 角色实体
     */
    Optional<Role> findByRoleCode(String roleCode);

    /**
     * 根据角色名称查找角色
     * @param roleName 角色名称
     * @return 角色实体
     */
    Optional<Role> findByRoleName(String roleName);

    /**
     * 检查角色编码是否存在
     * @param roleCode 角色编码
     * @param excludeId 排除的角色ID
     * @return 是否存在
     */
    boolean existsByRoleCode(String roleCode, Long excludeId);

    /**
     * 检查角色名称是否存在
     * @param roleName 角色名称
     * @param excludeId 排除的角色ID
     * @return 是否存在
     */
    boolean existsByRoleName(String roleName, Long excludeId);

    /**
     * 查找所有角色
     * @return 角色列表
     */
    List<Role> findAll();

    /**
     * 分页查询角色
     * @param roleName 角色名称（模糊查询）
     * @param status 状态
     * @param pageRequest 分页请求
     * @return 分页结果
     */
    PageResponse<Role> findPage(String roleName, Integer status, PageRequest pageRequest);

    /**
     * 根据状态查找角色列表
     * @param status 状态
     * @return 角色列表
     */
    List<Role> findByStatus(Integer status);

    /**
     * 根据角色类型查找角色列表
     * @param roleType 角色类型
     * @return 角色列表
     */
    List<Role> findByRoleType(Integer roleType);

    /**
     * 根据用户ID查找角色列表
     * @param userId 用户ID
     * @return 角色列表
     */
    List<Role> findByUserId(Long userId);

    /**
     * 删除角色
     * @param id 角色ID
     * @return 删除记录数
     */
    int deleteById(Long id);

    /**
     * 批量删除角色
     * @param ids 角色ID列表
     * @return 删除记录数
     */
    int deleteByIds(List<Long> ids);

    /**
     * 统计角色总数
     * @return 角色总数
     */
    long count();
}
